//+------------------------------------------------------------------+ //| NRTR Rosh v2.mq4 | //| Rosh | //| http://forexsystems.ru/phpBB/index.php | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "http://forum.alpari-idc.ru/viewtopic.php?t=48186" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Tomato #property indicator_color2 DeepSkyBlue #property indicator_color3 DeepSkyBlue #property indicator_color4 Tomato //---- input parameters extern int PerATR=40; extern double kATR=2.0; extern bool useSendMail=true; //---- buffers double SellBuffer[]; double BuyBuffer[]; double Ceil[]; double Floor[]; double Trend[]; int sm_Bars; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorBuffers(5); SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,251); SetIndexBuffer(0,SellBuffer); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,251); SetIndexBuffer(1,BuyBuffer); SetIndexEmptyValue(1,0.0); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,159); SetIndexBuffer(2,Ceil); SetIndexEmptyValue(2,0.0); SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,159); SetIndexBuffer(3,Floor); SetIndexEmptyValue(3,0.0); SetIndexBuffer(4,Trend); SetIndexEmptyValue(4,0); //---- return(0); } //+------------------------------------------------------------------+ //| пробитие верха ДАУНтренда | //+------------------------------------------------------------------+ bool BreakDown(int shift) { bool result=false; if (Close[shift]>SellBuffer[shift+1]) result=true; return(result); } //+------------------------------------------------------------------+ //| пробитие дна АПтренда | //+------------------------------------------------------------------+ bool BreakUp(int shift) { bool result=false; if (Close[shift]Ceil[shift+1]) result=true; return(result); } //+------------------------------------------------------------------+ //| определение предыдущего тренда | //+------------------------------------------------------------------+ bool Uptrend(int shift) { bool result=false; if (Trend[shift+1]==1) result=true; if (Trend[shift+1]==-1) result=false; if ((Trend[shift+1]!=1)&&(Trend[shift+1]!=-1)) Print("Внимание! Тренд не определен, такого быть не может. Бар от конца ",(Bars-shift)); return(result); } //+------------------------------------------------------------------+ //| вычисление волатильности | //+------------------------------------------------------------------+ double ATR(int iPer,int shift) { double result; result=iATR(NULL,0,iPer,shift); return(result); } //+------------------------------------------------------------------+ //| установка нового уровня потолка | //+------------------------------------------------------------------+ void NewCeil(int shift) { Ceil[shift]=Close[shift]; Floor[shift]=0.0; } //+------------------------------------------------------------------+ //| установка нового уровня пола | //+------------------------------------------------------------------+ void NewFloor(int shift) { Floor[shift]=Close[shift]; Ceil[shift]=0.0; } //+------------------------------------------------------------------+ //| установка уровня поддержки АПтренда | //+------------------------------------------------------------------+ void SetBuyBuffer(int shift) { BuyBuffer[shift]=Close[shift]-kATR*ATR(PerATR,shift); SellBuffer[shift]=0.0; } //+------------------------------------------------------------------+ //| установка уровня поддержки ДАУНтренда | //+------------------------------------------------------------------+ void SetSellBuffer(int shift) { SellBuffer[shift]=Close[shift]+kATR*ATR(PerATR,shift); BuyBuffer[shift]=0.0; } //+------------------------------------------------------------------+ //| реверс тренда и установка новых уровней | //+------------------------------------------------------------------+ void NewTrend(int shift) { if (Trend[shift+1]==1) { Trend[shift]=-1; NewFloor(shift); SetSellBuffer(shift); } else { Trend[shift]=1; NewCeil(shift); SetBuyBuffer(shift); } if ((Trend[shift+1]!=1)&&(Trend[shift+1]!=-1)) Print("Внимание! Тренд не определен, такого быть не может"); } //+------------------------------------------------------------------+ //| продолжение тренда | //+------------------------------------------------------------------+ void CopyLastValues(int shift) { SellBuffer[shift]=SellBuffer[shift+1]; BuyBuffer[shift]=BuyBuffer[shift+1]; Ceil[shift]=Ceil[shift+1]; Floor[shift]=Floor[shift+1]; Trend[shift]=Trend[shift+1]; } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int limit; if (counted_bars>0) limit=Bars-counted_bars; if (counted_bars<0) return(0); if (counted_bars==0) { limit=Bars-PerATR-1; if (Close[limit+1]>Open[limit+1]) {Trend[limit+1]=1;Ceil[limit+1]=Close[limit+1];BuyBuffer[limit+1]=Close[limit+1]-kATR*ATR(PerATR,limit+1);} if (Close[limit+1]=0;cnt--) { if (Uptrend(cnt)) { if (BreakCeil(cnt)) { NewCeil(cnt); SetBuyBuffer(cnt); Trend[cnt]=1; continue; } if (BreakUp(cnt)) { NewTrend(cnt); continue; } CopyLastValues(cnt); } else { if (BreakFloor(cnt)) { NewFloor(cnt); SetSellBuffer(cnt); Trend[cnt]=-1; continue; } if (BreakDown(cnt)) { NewTrend(cnt); continue; } CopyLastValues(cnt); } } //---- return(0); } //+------------------------------------------------------------------+